package com.example.lettcode._202412._20241213;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
415. 字符串相加
给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库（比如 BigInteger）， 也不能直接将输入的字符串转换为整数形式。

示例 1：
输入：num1 = "11", num2 = "123"
输出："134"

示例 2：
输入：num1 = "456", num2 = "77"
输出："533"

示例 3：
输入：num1 = "0", num2 = "0"
输出："0"

提示：
1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
 */
public class _415_zi_fu_chuan_xiang_jia {

    public static void main(String[] args) {
       String num1 = "456", num2 = "77";
        System.out.println(addStrings2(num1, num2));
    }

    public static String addStrings(String num1, String num2) {
        Map<Character, Integer> map = new HashMap<>();
        map.put('0', 0);
        map.put('1', 1);
        map.put('2', 2);
        map.put('3', 3);
        map.put('4', 4);
        map.put('5', 5);
        map.put('6', 6);
        map.put('7', 7);
        map.put('8', 8);
        map.put('9', 9);
        int length1 = num1.length();
        int length2 = num2.length();
        int length3 = length1 > length2 ? length1 : length2;

        int k = 0;
        num1 = new StringBuilder(num1).reverse().toString();
        num2 = new StringBuilder(num2).reverse().toString();
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < length3; i++) {
            int value1 = 0;
            int value2 = 0;
            if (i < length1) {
                 value1 = map.get(num1.charAt(i));
            }

            if (i < length2) {
                value2 = map.get(num2.charAt(i));
            }

            int value = value1 + value2 + k;
            if (value / 10 > 0) {
               k = 1;
               value = value - 10;
            } else {
               k = 0;
            }
            list.add(value);
        }
        if (k != 0) {
            list.add(k);
        }
        String ret = "";
        for (int i = list.size() - 1; i >= 0; i--) {
            ret += list.get(i);
        }
        return ret;
    }

    public static String addStrings2(String num1, String num2) {
        int m = num1.length() - 1, n = num2.length() - 1, value = 0;
        StringBuilder builder = new StringBuilder();
        while (m >= 0 || n >= 0 || value == 1) {
            int x = m >= 0 ? num1.charAt(m) - '0' : 0;
            int y = n >= 0 ? num2.charAt(n) - '0' : 0;

            int temp = x + y + value;
            builder.append(temp%10);
            value = temp / 10;
            m--;
            n--;
        }
        return builder.reverse().toString();
    }
}
